<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 基础数据模型
      // var arr = [
      //   { id: '29', pid: '', name: '总裁办' },
      //   { id: '2c', pid: '', name: '财务部' },
      //   { id: '2d', pid: '2c', name: '财务核算部' },
      //   { id: '2f', pid: '2c', name: '薪资管理部' },
      //   { id: 'd2', pid: '', name: '技术部' },
      //   { id: 'd3', pid: 'd2', name: 'Java研发部' },
      //   { id: 'd31', pid: 'd3', name: 'Java研发部333' },
      //   { id: 'd33', pid: 'd3', name: 'Java研发部333' },
      // ];

      // // 知识点就是一个  递归
      // function fn(arr, pid) {
      //   const list = [];
      //   arr.forEach((item) => {
      //     if (item.pid === pid) {
      //       // const children = [];
      //       item.children = fn(arr, item.id);
      //       // 如果循环的每一个元素的 pid 和传进来的 id相等，就找到了父元素，进入到新数组
      //       list.push(item);
      //     }
      //   });
      //   return list;
      // }

      // console.log(fn(arr, '')); //数组---三个对象
    </script>
    <script>
      // 写一个函数，传递一个数组和一个id，根据id得到对应对的名称
      var data = [
        {
          id: 1,
          name: '家电',
          goods: [
            { id: 11, name: '冰箱', goods: [{ id: 111, name: '海尔' }] },
            { id: 12, name: '洗衣机' },
          ],
        },
        { id: 2, name: '服饰' },
      ];

      // let obj = {};
      // function fn(arr, id) {
      //   arr.forEach((item) => {
      //     if (item.id === id) {
      //       obj = item;
      //     } else if (item.goods && item.goods.length > 0) {
      //       obj = fn(item.goods, id);
      //     }
      //   });
      //   return obj;
      // }

      // console.log(fn(data, 1)); // 家电
      // console.log(count);
      // console.log(fn(data, 11)); // 冰箱
      // console.log(fn(data, 111)); // 海尔
      // console.log(fn(data, 11231)); // undeinfe ''

      // 需求： 找到数据以后，能不能立即退出循环
      // break  cotinue  ---  他们只能在 while  for计数器循环里面使用
      let obj = {};
      let count = 0;
      function fn(arr, id) {
        for (let i = 0; i < arr.length; i++) {
          count++;
          if (arr[i].id === id) {
            obj = arr[i];
            break;
          } else if (arr[i].goods && arr[i].goods.length > 0) {
            obj = fn(arr[i].goods, id);
          }
        }
        // arr.forEach((item) => {
        //   count++;
        //   if (item.id === id) {
        //     obj = item;
        //     break;
        //   } else if (item.goods && item.goods.length > 0) {
        //     obj = fn(item.goods, id);
        //   }
        // });
        return obj;
      }

      console.log(fn(data, 1)); // 家电
      console.log(count);
    </script>
    <script>
      // 退出循环 break  continue 一般只用在 while for计数器循环里面
      // es6新增的一些数组迭代方法 forEach map filter some 。。。。 正常情况下都不能退出循环
      // 非正常情况下可以退出 ---  抛出异常的方式，可以间接的实现退出循环
      const list = [1, 2, 3, 4, 5, 6, 7];
      list.forEach((item) => {
        if (item === 3) {
          // return; 只能退出当前函数
          throw '错误';
        }
        console.log(item);
      });
    </script>
  </body>
</html>
